package qc.module.ehs.api.controller;

import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.web.bind.annotation.*;
import qc.common.core.constants.QCAuthConstant;
import qc.common.core.exception.QCPromptException;
import qc.module.ehs.dto.warehouse.WareHouseDto;
import qc.module.ehs.service.EhsWareHouseService;
import qc.module.platform.dto.dept.DeptSimpleDto;

import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * WareHouseController
 * 仓库
 *
 * @author QuCheng Tech
 * @create 2024/11/11
 */
@RestController
@RequestMapping("/warehouse")
public class WareHouseController {
    
    @Autowired
    private EhsWareHouseService service;

    @Autowired
    HttpServletRequest request;

    @Autowired
    private RestTemplatePlatform restTemplatePlatform;

    /**
     * 获取所有仓库信息
     *
     * @param id 组织机构代码
     * @return List<WareHouseDto>
     * @author QuCheng Tech
     * @since 2024/11/12
     */
    @GetMapping("/all")
    public List<WareHouseDto> getAllByParam(@RequestParam String id){
        return service.getAll(id);
    }

    /**
     * 获取所有仓库信息
     *
     * @param id 组织机构代码
     * @return List<WareHouseDto>
     * @author QuCheng Tech
     * @since 2024/11/12
     */
    @GetMapping("/all/{id}")
    public List<WareHouseDto> getAllByPath(@PathVariable String id){
        return service.getAll(id);
    }

    /**
     * 获取指定仓库信息
     *
     * @param id 仓库ID
     * @return WareHouseDto
     * @author QuCheng Tech
     * @since 2024/11/12
     */
    @GetMapping("/get")
    public WareHouseDto getByParam(@RequestParam String id){
        return service.get(id);
    }

    /**
     * 获取指定仓库信息
     *
     * @param id 仓库ID
     * @return WareHouseDto
     * @author QuCheng Tech
     * @since 2024/11/12
     */
    @GetMapping("/get/{id}")
    public WareHouseDto getByPath(@PathVariable String id){
        return service.get(id);
    }

    /**
     * 新增
     *
     * @param dto 新增对象DTO
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/11/12
     */
    @RequestMapping(value = "/add",method = {RequestMethod.POST})
    public String add(@RequestBody WareHouseDto dto){
        return service.add(dto);
    }

    /**
     * 修改
     *
     * @param dto 修改对象DTO
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/11/12
     */
    @RequestMapping(value = "/update",method = {RequestMethod.POST,RequestMethod.PUT})
    public String update(@RequestBody WareHouseDto dto){
        return service.update(dto);
    }

    /**
     * 删除
     *
     * @param id 仓库ID
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/11/12
     */
    @DeleteMapping("/delete")
    public String deleteByParam(@RequestParam String id){
        return service.delete(id);
    }

    /**
     * 删除
     *
     * @param id 仓库ID
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/11/12
     */
    @DeleteMapping("/delete/{id}")
    public String deleteByPath(@PathVariable String id){
        return service.delete(id);
    }

    /**
     * 获取用户有权限的仓库
     * 根据当前用户获取指定组织机构代码中有访问权限的仓库集合；用户有访问权限才能进行出入库操作和查询；默认上级部门的对下级部门有访问权限；
     * 根据组织机构代码获取对应的部门ID，判断组织机构对应的部门（包含子级部门）与用户关联的部门，有关联的部门即为有访问权限；
     *
     * @param id 组织机构代码
     * @return List<WareHouseDto>
     * @author QuCheng Tech
     * @since 2024/11/21
     */
    @GetMapping("/uservalid")
    public List<WareHouseDto> getUserValidByParam(@RequestParam String id) throws QCPromptException {
        HttpHeaders headers = new HttpHeaders();
        headers.add(QCAuthConstant.TOKEN_HEADER_KEY, request.getHeader(QCAuthConstant.TOKEN_HEADER_KEY));
        headers.add(QCAuthConstant.PROJECT_CODE_HEADER_KEY, request.getHeader(QCAuthConstant.PROJECT_CODE_HEADER_KEY));
        //根据token获取用户关联的有效部门
        List<DeptSimpleDto> userDepts = restTemplatePlatform.getUserCanAccessDepts(headers);
        if (CollectionUtils.isEmpty(userDepts)) throw new QCPromptException("当前用户无有效项目部门信息");
        List<Integer> userDeptIds = userDepts.stream().map(DeptSimpleDto::getId).collect(Collectors.toList());

        List<Integer> userValidDeptIds = new ArrayList<>();//用户有权限的部门ID集合，包含所有子级部门（默认上级部门的对下级部门有访问权限；）
        userValidDeptIds.addAll(userDeptIds);

        //默认上级部门的对下级部门有访问权限：获取用户有权限部门的所有下级部门
        for (Integer deptId : userDeptIds) {
            List<DeptSimpleDto> subDepts = restTemplatePlatform.getDeptChildsList(deptId);
            if (CollectionUtils.isNotEmpty(subDepts)) {
                List<Integer> subDeptIds = subDepts.stream().map(DeptSimpleDto::getId).collect(Collectors.toList());
                userValidDeptIds.addAll(subDeptIds);
            }
        }

        return service.getUserValid(id,userValidDeptIds.stream().distinct().collect(Collectors.toList()));
    }

    /**
     * 获取用户有权限的仓库
     * 根据当前用户获取指定组织机构代码中有访问权限的仓库集合；用户有访问权限才能进行出入库操作和查询；默认上级部门的对下级部门有访问权限；
     * 根据组织机构代码获取对应的部门ID，判断组织机构对应的部门（包含子级部门）与用户关联的部门，有关联的部门即为有访问权限；
     *
     * @param id 组织机构代码
     * @return List<WareHouseDto>
     * @author QuCheng Tech
     * @since 2024/11/21
     */
    @GetMapping("/uservalid/{id}")
    public List<WareHouseDto> getUserValidByPath(@PathVariable String id) throws QCPromptException {
        HttpHeaders headers = new HttpHeaders();
        headers.add(QCAuthConstant.TOKEN_HEADER_KEY, request.getHeader(QCAuthConstant.TOKEN_HEADER_KEY));
        headers.add(QCAuthConstant.PROJECT_CODE_HEADER_KEY, request.getHeader(QCAuthConstant.PROJECT_CODE_HEADER_KEY));
        //根据token获取用户关联的有效部门
        List<DeptSimpleDto> userDepts = restTemplatePlatform.getUserCanAccessDepts(headers);
        if (CollectionUtils.isEmpty(userDepts)) throw new QCPromptException("当前用户无有效项目部门信息");
        List<Integer> userDeptIds = userDepts.stream().map(DeptSimpleDto::getId).collect(Collectors.toList());

        List<Integer> userValidDeptIds = new ArrayList<>();//用户有权限的所有部门ID集合，包含所有子级部门（默认上级部门的对下级部门有访问权限；）
        userValidDeptIds.addAll(userDeptIds);

        //默认上级部门的对下级部门有访问权限：获取用户有权限部门的所有下级部门
        for (Integer deptId : userDeptIds) {
            List<DeptSimpleDto> subDepts = restTemplatePlatform.getDeptChildsList(deptId);
            if (CollectionUtils.isNotEmpty(subDepts)) {
                List<Integer> subDeptIds = subDepts.stream().map(DeptSimpleDto::getId).collect(Collectors.toList());
                userValidDeptIds.addAll(subDeptIds);
            }
        }
        
        return service.getUserValid(id,userValidDeptIds.stream().distinct().collect(Collectors.toList()));
    }
}
